/**********************************************************************************************************************
 * \file Cpu0_Main.c
 * \brief 以太网链路层中断通信实现
 * \description 基于GETH模块实现的以太网链路层中断通信功能
 *********************************************************************************************************************/

#include "Ifx_Types.h"
#include "IfxStm.h"
#include "IfxGeth_Eth.h"
#include "Configuration.h"
#include "ConfigurationIsr.h"
#include "Ifx_Lwip.h"
#include "LinkLayerComm.h"

/* 全局变量 */
IfxCpu_syncEvent g_cpuSyncEvent = 0; /* CPU同步事件 */

/* 本地函数声明 */
static void handleReceivedFrame(uint8* data, uint32 length);

void core0_main (void)
{
    /* 启用CPU全局中断 */
    IfxCpu_enableInterrupts();

    /* 禁用看门狗 */
    IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());

    /* 等待CPU同步事件 */
    IfxCpu_emitEvent(&g_cpuSyncEvent);
    IfxCpu_waitEvent(&g_cpuSyncEvent, 1);

    /* 配置STM定时器用于系统时间基准 */
    IfxStm_CompareConfig stmCompareConfig;
    IfxStm_initCompareConfig(&stmCompareConfig);
    stmCompareConfig.triggerPriority     = ISR_PRIORITY_OS_TICK;
    stmCompareConfig.comparatorInterrupt = IfxStm_ComparatorInterrupt_ir0;
    stmCompareConfig.ticks               = IFX_CFG_STM_TICKS_PER_MS;
    stmCompareConfig.typeOfService       = IfxSrc_Tos_cpu0;
    IfxStm_initCompare(&MODULE_STM0, &stmCompareConfig);

    /* 初始化GETH模块和LwIP协议栈（为了复用GETH初始化） */
    IfxGeth_enableModule(&MODULE_GETH);
    eth_addr_t ethAddr = {{0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}};
    Ifx_Lwip_init(ethAddr);
    
    /* 初始化链路层通信模块 */
    IfxGeth_Eth *gethDriver = IfxGeth_get();
    LinkLayerComm_init(gethDriver);
    
    /* 注册接收回调函数 */
    LinkLayerComm_registerRxCallback(handleReceivedFrame);

    /* 主循环 - 处理以太网通信 */
    while (1)
    {
        /* 处理待发送的以太网帧 */
        LinkLayerComm_processTxBuffer();
    }
}

/* STM0中断处理函数 - 更新系统时间 */
IFX_INTERRUPT(updateSystemTimerISR, 0, ISR_PRIORITY_OS_TICK);

void updateSystemTimerISR(void)
{
    /* 配置下一次中断在1ms后触发 */
    IfxStm_increaseCompare(&MODULE_STM0, IfxStm_Comparator_0, IFX_CFG_STM_TICKS_PER_MS);
    
    /* 更新系统时间计数 */
    g_TickCount_1ms++;
}

/**
 * \brief 处理接收到的以太网帧
 * \param data 接收到的数据（不包含MAC头）
 * \param length 数据长度
 */
static void handleReceivedFrame(uint8* data, uint32 length)
{
    /* 这里可以添加对接收到的数据的处理逻辑 */
    // 例如：解析以太网类型、处理特定协议的数据等
    
    /* 示例：简单回显接收到的数据 */
    if (length > 0) {
        /* 获取目标MAC地址（这里使用广播地址作为示例） */
        uint8 broadcastMac[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
        
        /* 使用固定的以太网类型进行测试 (0x88B5 作为示例，自定义协议类型) */
        uint16 ethType = 0x88B5;
        LinkLayerComm_sendFrame(data, length, broadcastMac, ethType);
    }
}

/**
 * \brief 以太网接收中断服务函数
 */
IFX_INTERRUPT(ISR_Geth_Rx, CPU_WHICH_SERVICE_ETHERNET, ISR_PRIORITY_GETH_RX)
{
    /* 处理接收到的以太网帧 */
    LinkLayerComm_processRxFrame();
}

/**
 * \brief 以太网发送中断服务函数
 */
IFX_INTERRUPT(ISR_Geth_Tx, CPU_WHICH_SERVICE_ETHERNET, ISR_PRIORITY_GETH_TX)
{
    /* 处理发送完成后的逻辑 */
    /* 1. 清除发送中断标志 */
    IfxGeth_Eth *gethDriver = IfxGeth_get();
    IfxGeth_dma_clearInterruptFlag(gethDriver->gethSFR, 
                                  IfxGeth_DmaChannel_0, 
                                  IfxGeth_DmaInterruptFlag_transmitInterrupt);
    
    /* 2. 处理等待发送的缓冲区 */
    LinkLayerComm_processTxBuffer();
}
